package com.zwr.sheller.core.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.zwr.sheller.core.pojo.Seller;

import java.util.Date;

/**
 * @author bill
 * @version 1.0
 * @date 2020/10/12 0012 10:15
 */
public class JwtUtil {

    //JWT验证过期时间 EXPIRE_TIME(单位:毫秒) , 指定为30分钟

    private static final long EXPIRE_TIME = 30 * 60 * 1000;
     // private static final long EXPIRE_TIME = 60*1000;  // 60秒钟用于测试

    /**
     * 生成JWT
     * @param phone phone storeId
     * @return string
     */
    public static String sign(String phone,Long storeId,Long sellerId,Long merchantId) {
        // 设置jwt的过期时间
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);

        //普通管理员和超级管理员验证手机号,采用手机号后六位加密生成私钥
        Algorithm algorithm = Algorithm.HMAC256(phone.substring(5));


        //生成jwt(核心代码)
        String token = JWT.create()
                .withClaim("phone", phone)
                .withClaim("storeId",storeId)
                .withClaim("sellerId",sellerId)
                .withClaim("merchantId",merchantId)
                .withExpiresAt(date)
                .sign(algorithm);
        return token;
    }

    /**
     * 获得token中的信息无需secret解密也可直接获取
     * @return jwt中声明的手机号
     */
    public static String getPhone(String token) {
        //从token当中解密得到jwt中的载荷信息,可以调用的对象
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("phone").asString();
    }

    /**
     * 获得token中的信息无需secret解密也可直接获取
     * @return jwt中声明的id
     */
    public static Long getStoreId(String token) {
        //从token当中解密得到jwt中的载荷信息,可以调用的对象
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("storeId").asLong();
    }

    public static String getSellerId(String token) {
        //从token当中解密得到jwt中的载荷信息,可以调用的对象
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("sellerId").asString();
    }

    public static String getMerchantId(String token) {
        //从token当中解密得到jwt中的载荷信息,可以调用的对象
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("merchantId").asString();
    }

    /**
     * 校验jwt是否正确
     * @param token  需要校验的jwt字符串
     * @return 返回验证结果
     */
    public static boolean verify(String token, String phone) {
        try {
            //根据密码生成JWT私钥校验器
            // 普通管理员和超级管理员,都采用手机号后六位加密
            Algorithm algorithm =  Algorithm.HMAC256(phone.substring(5));

            //校验环节
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("phone", phone)
                    .build();

            //效验JWT:通过异常来确定是否校验成功
            DecodedJWT decodedJWT = verifier.verify(token);
            // 测试一下jwt验证后生成的状态
            // System.out.println(decodedJWT);
            return true;
        } catch (Exception exception) {
            return false;
        }
    }
}